package com.heatup.apt.management.task;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.heatup.apt.common.constants.CouponConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.heatup.apt.common.dao.ActivityInfoMapper;
import com.heatup.apt.common.dao.ActivityUserMapper;
import com.heatup.apt.common.dao.CouponDetailMapper;
import com.heatup.apt.common.dao.CouponInfoMapper;
import com.heatup.apt.common.dao.InviteCouponMapper;
import com.heatup.apt.common.dao.OrderInfoMapper;
import com.heatup.apt.common.util.CouponUtil;
import com.heatup.apt.common.util.DateUtils;
import com.heatup.apt.management.service.coupon.CouponService;
import com.heatup.apt.management.service.custom.CustomService;
import com.heatup.apt.model.coupon.ActivityInfo;
import com.heatup.apt.model.coupon.ActivityUser;
import com.heatup.apt.model.coupon.CouponDetail;
import com.heatup.apt.model.coupon.CouponInfo;
import com.heatup.apt.model.coupon.InviteCoupon;


//maxxiang 优惠券相关的定时任务：
//檬会员体验券到达使用时间时，自动变为檬会员
@Component
@EnableScheduling   //Spring 4.X版本需要此注解
public class CouponTask {
    Logger log = LoggerFactory.getLogger(CouponTask.class);
	
    @Autowired
    private CouponDetailMapper couponDetailMapper;
    
    @Autowired
    private ActivityUserMapper activityUserMapper;
    
    @Autowired
    private OrderInfoMapper orderInfoMapper;

	@Autowired
	CustomService customService;
	
	@Autowired
    private ActivityInfoMapper  activityInfoMapper;
	
	@Autowired
	private CouponInfoMapper couponInfoMapper;
	
	@Autowired
	private InviteCouponMapper inviteCouponMapper;
	
	@Autowired
	private CouponService couponService; 
	

    /**
     * java定时器：coupon_type为3:檬会员资格的，当use_begin_date到来时，自动给用户加上会员 每天一次即可
     *
     * 字段   允许值   允许的特殊字符
     * 秒      0-59    , - * /
     * 分      0-59    , - * /
     * 小时    0-23    , - * /
     * 日期    1-31    , - * ? / L W C
     * 月份    1-12 或者 JAN-DEC    , - * /
     * 星期    1-7 或者 SUN-SAT    , - * ? / L C #
     * 年（可选）    留空, 1970-2099    , - * /
     * - 区间
     * 通配符
     * ? 你不想设置那个字段
     */
	@Scheduled(cron = "0 0 0,1,6 * * ?") // 每天0点和1点,6点 触发一次。
	public void updateVipCoupon() {
		try {
			List<CouponDetail> detailList = couponDetailMapper.queryCouponDetailListByVipType();
			log.info("---------------updateVipCoupon exec at:" + DateUtils.toDateString(new Date())
					+ ", detailList count:" + detailList.size());
			for (int i = 0; i < detailList.size(); i++) {
				CouponDetail detail = detailList.get(i);
				int dayNum = (int) ((DateUtils.AddDays(detail.getUseEndDate(), 1).getTime()
						- detail.getUseBeginDate().getTime()) / (24 * 60 * 60 * 1000));
				if (dayNum < 1)
					continue;
				// 增加会员的天数
				customService.addUserVipDayNum(detail.getUserId(), dayNum,detail.getId().intValue());
				detail.setIsUsed(1); // 设置为已使用
				couponDetailMapper.updateByPrimaryKeySelective(detail); // 更新为已使用
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error("==>>檬会员资格定时器异常：" + e.getMessage());
		}
	}

	/**
	 * java定时器：coupon_type为5:团课包月卡兑换券，当use_begin_date到来时，自动给用户加上会员 每天一次即可
	 *
	 * 字段   允许值   允许的特殊字符
	 * 秒      0-59    , - * /
	 * 分      0-59    , - * /
	 * 小时    0-23    , - * /
	 * 日期    1-31    , - * ? / L W C
	 * 月份    1-12 或者 JAN-DEC    , - * /
	 * 星期    1-7 或者 SUN-SAT    , - * ? / L C #
	 * 年（可选）    留空, 1970-2099    , - * /
	 * - 区间
	 * 通配符
	 * ? 你不想设置那个字段
	 */
//	@Scheduled(cron = "0 0 0,1,6 * * ?")
	public void updateMonthlyTeamCourseCoupon(){
		try {
			List<CouponDetail> detailList = couponDetailMapper.queryUsedFixedDateCouponDetailListByCouponType(CouponConstants.CouponType_Monthly_Team_Course);
			if(detailList!=null && detailList.size()>0){
				for(int i =0;i<detailList.size();i++){
					CouponDetail detail = detailList.get(i);
					int dayNum = (int) ((DateUtils.AddDays(detail.getUseEndDate(), 1).getTime()
							- detail.getUseBeginDate().getTime()) / (24 * 60 * 60 * 1000));
					if (dayNum < 1)
						continue;
					// 增加会员的天数
					//customService.addUserVipDayNum(detail.getUserId(), dayNum,detail.getId().intValue());
					customService.addUserMonthTeamCourseProduct(detail.getUserId(),dayNum,detail);
					detail.setIsUsed(1); // 设置为已使用
					couponDetailMapper.updateByPrimaryKeySelective(detail); // 更新为已使用
				}
			}

		} catch (Exception e) {
			e.printStackTrace();
			log.error("====>>固定使用期限的团课包月卡定时器：" + e.getMessage());
		}
	}
    
    /**
     * java定时器：当被邀请者完成订单的时候 邀请者可获得优惠券
     *
     * 字段   允许值   允许的特殊字符
     * 秒      0-59    , - * /
     * 分      0-59    , - * /
     * 小时    0-23    , - * /
     * 日期    1-31    , - * ? / L W C
     * 月份    1-12 或者 JAN-DEC    , - * /
     * 星期    1-7 或者 SUN-SAT    , - * ? / L C #
     * 年（可选）    留空, 1970-2099    , - * /
     * - 区间
     * 通配符
     * ? 你不想设置那个字段
     */
	@Scheduled(cron = "0 0 1 * * ?") // 设置为每天凌晨一点钟整跑一次
	public void addcouponDetail() {
		log.info(
				"=================================addcouponDetail=====邀请好友可获得优惠券定时器start==============================================");
		try {
			// 查询邀请好友这个活动的所有数据
			Map<String, Object> map = new HashMap<>();
			map.put("activityId", 1);
			map.put("isGetedCoupon", 0);
			List<ActivityUser> activityUL = activityUserMapper.queryActivityUser(map);
			for (ActivityUser au : activityUL) {
				int orderCount = orderInfoMapper.queryOrderStatusIsFinish(au.getInviteUserid());
				ActivityInfo activityInfo = activityInfoMapper.queryActivityInfo(au.getActivityId(), 0);
				CouponInfo couponInfo = couponInfoMapper
						.selectById(Integer.valueOf(activityInfo.getCouponId()));
				// 表示有已完成的订单给邀请者送优惠券
				if (orderCount > 0 && activityInfo != null) {
					log.info(
							"============================addcouponDetail==========好友 完成订单 邀请者可获得优惠券 ==============================================");
					if (couponInfo.getMaxCount() > 0 && couponInfo.getGetedCount() >= couponInfo.getMaxCount()) { // 如果已到达领取券的最大值
						log.info("============================addcouponDetail couponInfo.getMaxCount():"
								+ couponInfo.getMaxCount());
						continue;
					}

					CouponDetail couponDetail = new CouponDetail();
					couponDetail.setCouponCode(generatorCouponCodeBy(couponInfo.getId()));
					couponDetail.setCouponId(Integer.valueOf(activityInfo.getCouponId()));
					log.info("================================CouponCode:" + couponDetail.getCouponCode()
							+ "==================================");
					couponDetail.setGetTime(new Date());
					couponDetail.setMakeTime(new Date());
					couponDetail.setIsGeted(1);
					couponDetail.setIsValid(1);
					couponDetail.setUserId(au.getUserid());
					couponDetail.setIsUsed(0);
					if (couponInfo.getUseMode() == 1) {
						couponDetail.setUseBeginDate(DateUtils.getDateShort(new Date()));
						Date date = DateUtils.getDateShort(new Date());
						date = DateUtils.AddDays(date, couponInfo.getDayNum() - 1);
						couponDetail.setUseEndDate(date);
					} else {
						couponDetail.setUseBeginDate(couponInfo.getUseBeginDate());
						couponDetail.setUseEndDate(couponInfo.getUseEndDate());
					}
					int boolD = 0;
					int boolU = 0;
					try {
						boolD = couponDetailMapper.insert(couponDetail);

						// 券的领取人数加1
						couponInfo.setGetedCount(couponInfo.getGetedCount() + 1);
						couponInfoMapper.updateSelectiveById(couponInfo);

						au.setIsGetedCoupon(1);
						boolU = activityUserMapper.updateByPrimaryKeySelective(au);
					} catch (Exception e) {
						throw new RuntimeException();
					}
					System.out.println("boolU:" + boolU);
					log.info("=============================addcouponDetail=========插入优惠券明细boolD：" + boolD
							+ " 修改活动明细状态boolU：" + boolU + "==============================================");
				} else {
					log.info("==========================addcouponDetail null=========orderCount:" + orderCount
							+ " activityInfo:" + activityInfo);
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
			log.error("==>>邀请好友可获得优惠券定时器异常：" + ex.getMessage().toString());
		}

	}
    
    /**
	 * @see //按照批次信息生成兑换码,如果获取方式是1：用户输入码，则直接使用couponInfo里面的兑换码；
	 * @see //如果兑换方式为2：系统自动生成：兑换码==4位批次+12位不重复的字符串组合。保证唯一性。
	 * @param couponId 兑换券批次ID
	 * @return String couponCode 兑换码
	 */
	public String generatorCouponCodeBy(Integer couponId) {
		CouponInfo couponInfo = couponInfoMapper.queryById(couponId);
		if (couponInfo != null) {
			// 如果获取方式是用户输入兑换码领取，表示兑换码已固定，否则则生成兑换码
			if (1 == couponInfo.getGetMode().intValue()) {
				return couponInfo.getCouponCode();
			} else {
				String couponCode = null;
				// 从数据库查询出是否存在兑换码，如果有则从新生成。
				while (true) {
					couponCode = CouponUtil.generatorCoupinCode(couponId);
					CouponDetail couponDetail = couponDetailMapper.selectByCouponCode(couponCode);
					if (couponDetail == null) {
						break;
					}
				}
				log.info("=====================================couponCode:"+couponCode+"==============================================");
				return couponCode;
			}
		} else {
			return null;
		}
	}
	
	@Scheduled(cron = "1 */20 * * * ?") // 每个5分钟跑一次
	public void addInviteCoupon(){
		log.info("=================================== addInviteCoupon start==================================");
		// 防止报错
		try {
			// 先查出没有送券的用户
			List<InviteCoupon> isNotGetList = inviteCouponMapper.queryIsNotGetByList();
			// 插入优惠券
			for(InviteCoupon ic : isNotGetList){
				if(ic.getCouponId().indexOf("#") > 0){
					String[] couponIds = ic.getCouponId().split("#");
					for(String str:couponIds){
						int  couponId  = Integer.valueOf(str);
						CouponInfo couponInfo = couponInfoMapper.selectById(couponId);
						if (couponInfo == null){
							break; //表示没有该兑换券
						}
						if(couponInfo.getCouponStatus()!=CouponConstants.CouponStatus_Online 
								|| couponInfo.getMaxCount() != 0 && couponInfo.getGetedCount() >= couponInfo.getMaxCount()){
							break;  //该优惠券已下架  ,已领满
						}
						CouponDetail couponDetail = couponDetailMapper.selectByCouponId(couponId, ic.getUserId().intValue());
						if (couponDetail != null && couponDetail.getUserId() == ic.getUserId().intValue()){
							break; //该券已领取
						}
						couponService.insertOrUpdateCouponDetailBy(couponInfo, ic.getUserId(), null, true, null);// 插入优惠券
						inviteCouponMapper.updateInviteCouponIsGetByUserId(ic.getUserId());// 将优惠券置为已领取状态
						
					}
				}else{
					int  couponId  = Integer.valueOf(ic.getCouponId());
					CouponInfo couponInfo = couponInfoMapper.selectById(couponId);
					if (couponInfo == null){
						break; //表示没有该兑换券
					}
					if(couponInfo.getCouponStatus()!=CouponConstants.CouponStatus_Online 
							|| couponInfo.getMaxCount() != 0 && couponInfo.getGetedCount() >= couponInfo.getMaxCount()){
						break;  //该优惠券已下架  ,已领满
					}
					CouponDetail couponDetail = couponDetailMapper.selectByCouponId(couponId, ic.getUserId().intValue());
					if (couponDetail != null && couponDetail.getUserId() == ic.getUserId().intValue()){
						break; //该券已领取
					}
					couponService.insertOrUpdateCouponDetailBy(couponInfo, ic.getUserId(), null, true, null);// 插入优惠券
					inviteCouponMapper.updateInviteCouponIsGetByUserId(ic.getUserId());// 将优惠券置为已领取状态
				}
			}
		} catch (Exception e) {
			// TODO: handle exception
			log.error("=========================== addInviteCoupon error :"+e.toString()+e.getCause(),e);
		}
		log.info("=================================== addInviteCoupon end ==================================");
	}
}
